/*
 * PagFormularioEtapa.java
 * 
 * Projeto: Kruskal - SRAC
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */
package srac.controleatividades.cih;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;
import srac.controleatividades.cci.CtrlAtividade;
import srac.controleatividades.cdp.Etapa;

public class PagFormularioEtapa extends GenericForwardComposer {

    private CtrlAtividade ctrl = CtrlAtividade.getInstance();
    private Window winFormularioEtapa;
    private Datebox dataInicioSubmissao, dataFimSubmissao, dataFimValidacao, dataFimVerificacao;
    private Textbox descricaoEtapa;
    private Etapa obj;
    private int MODO;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        
        descricaoEtapa.setDisabled(false);
        dataInicioSubmissao.setDisabled(false);
        dataFimSubmissao.setDisabled(false);
        dataFimVerificacao.setDisabled(false);
        dataFimValidacao.setDisabled(false);

        if (MODO == CtrlAtividade.SALVAR) {
            String before = pegarDatas(new Date(System.currentTimeMillis()));
            dataInicioSubmissao.setConstraint("after " + before); //Bloqueia as datas do calendaria anteriores ao dia atual
        }
    }

    public void onCreate$winFormularioEtapa() {

        //if feito para verificar se existe algum usuario logado, se nao existir eh redirecionado para o login
        if (Executions.getCurrent().getSession().getAttribute("usuario") == null) {
            Executions.sendRedirect("/");
            winFormularioEtapa.detach();
        } else {
            MODO = (Integer) arg.get("tipo");


            if (MODO != CtrlAtividade.SALVAR) {
                obj = (Etapa) arg.get("obj");
                preencherTela();
            }
        }
    }

    public void onChange$dataInicioSubmissao(Event event) {
        Date obj2 = dataInicioSubmissao.getValue();
        String before = pegarDatas(obj2);

        dataFimSubmissao.setConstraint("after " + before); //Bloqueia as datas após o ínicio da submissão
        dataFimVerificacao.setConstraint("after " + before); //Bloqueia as datas após o fim da submissão
        dataFimValidacao.setConstraint("after " + before); //Bloqueia as datas após o fim da verificação

        
    }

    public void onChange$dataFimSubmissao(Event event) {
        Date obj2 = dataFimSubmissao.getValue();
        String before = pegarDatas(obj2);

        dataFimVerificacao.setConstraint("after " + before); //Bloqueia as datas após o fim da submissão
        dataFimValidacao.setConstraint("after " + before); //Bloqueia as datas após o fim da verificação

        
    }

    public void onChange$dataFimVerificacao(Event event) {
        Date obj2 = dataFimVerificacao.getValue();
        String before = pegarDatas(obj2);

        dataFimValidacao.setConstraint("after " + before); //Bloqueia as datas após o fim da verificação

        
    }

    private void preencherTela() {
        descricaoEtapa.setText(obj.getDescricao());
        dataInicioSubmissao.setValue(obj.getDataInicioSubmissao().getTime());
        dataFimSubmissao.setValue(obj.getDataFimSubmissao().getTime());
        dataFimVerificacao.setValue(obj.getDataFimVerificacao().getTime());
        dataFimValidacao.setValue(obj.getDataFimValidacao().getTime());
    }

    

    public void onClick$salvarEtapa(Event event) {
        Calendar inicioSubmissao = Calendar.getInstance();
        Calendar fimSubmissao = Calendar.getInstance();
        Calendar fimVerificacao = Calendar.getInstance();
        Calendar fimValidacao = Calendar.getInstance();

        String msg = valido();

        if (msg.trim().equals("")) { //Se não faltou preecher nenhum campo da pág
            inicioSubmissao.setTime(dataInicioSubmissao.getValue());
            fimSubmissao.setTime(dataFimSubmissao.getValue());
            fimVerificacao.setTime(dataFimVerificacao.getValue());
            fimValidacao.setTime(dataFimValidacao.getValue());

            int result = validar(inicioSubmissao, fimSubmissao, fimVerificacao, fimValidacao); //Verificar se as datas estão corretas
            msg += imprimeValidacao(result);
            if (result >= 4) {
                if (MODO == CtrlAtividade.EDITAR) {
                    int dia1, mes1, ano1, dia2, mes2, ano2;
                    Calendar c = Calendar.getInstance();

                    dia1 = inicioSubmissao.getTime().getDay();
                    mes1 = inicioSubmissao.getTime().getMonth();
                    ano1 = inicioSubmissao.getTime().getYear();
                    dia2 = c.getTime().getDay();
                    mes2 = c.getTime().getMonth();
                    ano2 = c.getTime().getYear();

                    //Verifica se a nova data de inicio é hoje ou depois de hoje
                    if (((dia1 == dia2) && (mes1 == mes2) && (ano1 == ano2)) || inicioSubmissao.after(Calendar.getInstance())) 
                    {
                            if (validarEtapa(obj, inicioSubmissao, fimValidacao)) {
                                obj.setDescricao(descricaoEtapa.getText());
                                obj.setDataInicioSubmissao(inicioSubmissao);
                                obj.setDataFimSubmissao(fimSubmissao);
                                obj.setDataFimVerificacao(fimVerificacao);
                                obj.setDataFimValidacao(fimValidacao);
                                ctrl.alterarEtapa(obj);
                            } 
                            
                            else {
                                Messagebox.show("A etapa está no intervalo de uma outra etapa existente!", "Informe:", 0, Messagebox.EXCLAMATION);
                            }
                        }
                        else
                        {
                            Messagebox.show("A etapa está no intervalo de uma outra etapa existente!", "Informe:", 0, Messagebox.EXCLAMATION);
                        }
                    
                } 
                else {
                    if (validarEtapa(inicioSubmissao, fimValidacao)) {
                        ArrayList<Object> list = new ArrayList<Object>();
                        list.add(descricaoEtapa.getText());
                        list.add(inicioSubmissao);
                        list.add(fimSubmissao);
                        list.add(fimVerificacao);
                        list.add(fimValidacao);
                        
                        ctrl.incluirEtapa(list); //Inclui uma nova etapa
                       
                    } 
                    else {
                        Messagebox.show("A etapa está no intervalo de uma outra etapa existente!", "Informe:", 0, Messagebox.EXCLAMATION);
                    }
                }

            winFormularioEtapa.onClose();
            } 
            
            else if (result == 1) {
                Messagebox.show("O Inicio da Submissao está depois ou no mesmo dia que o Fim da Submissao", "Informe:", 0, Messagebox.EXCLAMATION);
            } 
            
            else if (result == 2) {
                Messagebox.show("O Fim da Submissao está depois ou no mesmo dia que o Fim da Verificação", "Informe:", 0, Messagebox.EXCLAMATION);
            } 
            
            else {
                Messagebox.show("O Fim da Verificação está depois ou no mesmo dia que o Fim da Validação", "Informe:", 0, Messagebox.EXCLAMATION);
            }

        } 
        
        else {
            Messagebox.show(msg, "Informe:", 0, Messagebox.EXCLAMATION);
        }
    }

    public String pegarDatas(Date data) { //Transforma a data passada por parametro em uma string
        List<String> lista = new ArrayList<String>();
        Date datas = data;
        Integer ano, mes, dia;
        ano = datas.getYear() + 1900;
        mes = datas.getMonth() + 1;
        dia = datas.getDate();
        lista.add(ano.toString());
        if (mes < 10) {
            lista.add("0" + mes.toString());
        } 
        else {
            lista.add(mes.toString());
        }
        if (dia < 10) {
            lista.add("0" + dia.toString());
        } 
        
        else {
            lista.add(dia.toString());
        }
        String resultado = lista.get(0) + lista.get(1) + lista.get(2);
        return resultado;
    }

    public void onClick$voltar(Event event) {
        winFormularioEtapa.onClose();
    }

    public void limparCampos() {
        descricaoEtapa.setText("");
        dataInicioSubmissao.setValue(null);
        dataFimSubmissao.setValue(null);
        dataFimVerificacao.setValue(null);
        dataFimValidacao.setValue(null);
    }

    private String valido() { //Verifica se algum campo do formulário está vazio
        String msg = "";
        if(descricaoEtapa.getText().equals(""))
        {
            msg += "- Descrição\n";
        }
        if (dataInicioSubmissao.getValue() == null) {
            msg += "- Data de Início para Submissões\n";
        }
        if (dataFimSubmissao.getValue() == null) {
            msg += "- Data de Fim para Submissões\n";
        }
        if (dataFimVerificacao.getValue() == null) {
            msg += "- Data de Fim para Verificações\n";
        }
        if (dataFimValidacao.getValue() == null) {
            msg += "- Data de Fim para Validações\n";
        }

        return msg;
    }

    public int validar(Calendar inicioSubmissao, Calendar fimSubmissao, Calendar fimVerificacao, Calendar fimValidacao) {
        if (inicioSubmissao.after(fimSubmissao) || ctrl.comparaDatas(inicioSubmissao, fimSubmissao)) {
            return 1; //Caso o inicioSubmissao seja depois do fimSubmissao ele retorna
        } 
        else if (fimSubmissao.after(fimVerificacao) || ctrl.comparaDatas(fimSubmissao, fimVerificacao)) {
            return 2;//Caso o fimSubmissao seja depois do fimVerificacao ele retorna
        } 
        else if (fimVerificacao.after(fimValidacao) || ctrl.comparaDatas(fimVerificacao, fimValidacao)) {

            return 3;//Caso o fimVerificacao seja depois do fimValidacao ele retorna
        }       
        else {
            return 4; //Caso todas as datas estejam corretas
        }

    }

    public boolean validarEtapa(Calendar inicioSubmissao, Calendar fimValidacao) { //Valida se ja existe alguma etapa no intervalo da nova etapa
        return ctrl.validarEtapa(inicioSubmissao, fimValidacao);
    }

    public boolean validarEtapa(Etapa obj, Calendar inicioSubmissao, Calendar fimValidacao) { //Valida se ja existe alguma etapa no intervalo da etapa alterada
        return ctrl.validarEtapa(obj, inicioSubmissao, fimValidacao);
    }

    public String imprimeValidacao(int result) { //Imprime as validações
        if (result == 1) {
            return "- Inicio da Submissão não pode ser depois do Fim da Submissão!\n";
        } 
        else if (result == 2) {
            return "- Fim da Submissão não pode ser depois do Fim da Verificação!\n";
        } 
        else if (result == 3) {
            return "- Fim da Verificação não pode ser depois do Fim da Validação!\n";
        }
        return "";
    }
}
